package gestorvideoclub.jdbc;

import gestorvideoclub.jdbc.AccesoDatos;
import gestorvideoclub.Alquiler;
import gestorvideoclub.Cliente;
import gestorvideoclub.Franquicia;
import gestorvideoclub.Pelicula;
import gestorvideoclub.Producto;
import gestorvideoclub.Proveedor;
import gestorvideoclub.Tarifa;
import gestorvideoclub.Ubicacion;
import gestorvideoclub.Videojuego;
import gestorvideoclub.enumeraciones.ProductoEnum;
import gestorvideoclub.enumeraciones.TipoProductoEnum;
import gestorvideoclub.util.UtilFecha;
import java.sql.*;
import java.util.*;
import java.util.ArrayList;

public class AlquilerJDBC {

    public static void insertarAlquiler(Alquiler alquiler) {
 
        String sql = "insert into alquileres (id_producto, id_cliente, id_tarifa, fechaInicio, fechaPrevDev, fechaDevReal)";
        sql += " values("+alquiler.getProducto().getId()+",";
        sql += " "+alquiler.getCliente().getId()+", "+alquiler.getTarifa().getId()+",";
        sql += " '" + UtilFecha.fechaMySQL(alquiler.getFechaInicio()) + "', '" + UtilFecha.fechaMySQL(alquiler.getFechaPrevistaDev()) + "',";
        sql += " '"+UtilFecha.fechaMySQL(new java.util.Date(0))+"')";

        //sSystem.out.println(sql);

        Connection con = null;
        Statement st = null;
        try {
            con = AccesoDatos.getConexion();
            st = con.createStatement();
            st.executeUpdate(sql);
            st.close();
            AccesoDatos.cerrarConexion(con);
            System.out.println("El alquiler se ha registrado correctamente.");
        } catch (SQLException e) {
            System.out.println("Error al insertar un nuevo alquiler " + e.getMessage());
        }
    }


    /**
     * Obtenemos el último alquiler que se ha realizado con este producto
     * @param producto del que vamos a obtener el último alquiler
     * @return el objeto alquiler asociado
     */
    public static Alquiler obtenerUltimoAlquilerProducto(Producto producto){
        Alquiler alquiler = new Alquiler();
        alquiler.setCliente(new Cliente());
        alquiler.setProducto(producto);
        alquiler.setTarifa(new Tarifa());
        String sql = "select * from alquileres where id_producto = "+producto.getId();
        sql += " and fechaDevReal = '1970-01-01' order by fechaInicio desc limit 1";

        //System.out.println(sql);
        Connection con = null;
        Statement st = null;
        ResultSet rs = null;
        
       
        try{
            //alquiler = new Alquiler();
            con = AccesoDatos.getConexion();
            st = con.createStatement();
            rs = st.executeQuery(sql);
            if(rs.next()){
                alquiler.setIdAlquiler(rs.getInt("Id"));
                alquiler.getProducto().setId(rs.getInt("id_producto"));
                alquiler.getCliente().setId(rs.getInt("id_cliente"));
                alquiler.getTarifa().setId(rs.getInt("id_tarifa"));
                String tex = rs.getString("fechaInicio");
                alquiler.setFechaInicio(UtilFecha.obtenerFechaBD(tex));
                tex = rs.getString("fechaPrevDev");
                alquiler.setFechaPrevistaDev(UtilFecha.obtenerFechaBD(tex));
                tex = rs.getString("fechaDevReal");
                alquiler.setFechaDevolucionReal(UtilFecha.obtenerFechaBD(tex));
               
            }
            else{
                alquiler = null;
            }
            rs.close();
            st.close();
        }
        catch(Exception e){
            System.out.println("Error al recuperar un alquiler "+e.getMessage());
        }

        if(alquiler != null){
            int id = alquiler.getCliente().getId();
            if(id > 0){
                alquiler.setCliente(ClienteJDBC.obtenerClientePorId(id));

                //Obtenemos el producto
                id = alquiler.getProducto().getId();
                TipoProductoEnum tipo = ProductoJDBC.obtenerTipoProductoPorId(id);
                alquiler.getProducto().setTipo(tipo);
                if(tipo.equals(TipoProductoEnum.BlueRay) || tipo.equals(TipoProductoEnum.DVD)){
                    alquiler.setProducto(PeliculaJDBC.obtenerPeliculaPorId(id));
                }
                else{
                    alquiler.setProducto(VideojuegoJDBC.obtenerVideojuegoPorId(id));
                }
            }
        }
            
        AccesoDatos.cerrarConexion(con);
        return alquiler;
    }


    public static void modificarAlquiler(Alquiler alquiler){
        String sql = "update alquileres set fechaDevReal ='"+UtilFecha.fechaMySQL(alquiler.getFechaDevolucionReal())+"' ";
        sql += " where Id ="+alquiler.getIdAlquiler();

        Connection con = null;
        Statement st = null;
                

        //System.out.println(sql);
        try{
            con = AccesoDatos.getConexion();
            st = con.createStatement();
            st.executeUpdate(sql);
            st.close();
        }
        catch(Exception e){
            System.out.println("Error al modificar el alquiler "+e.getMessage());
        }

        AccesoDatos.cerrarConexion(con);
    }

    
    public static ArrayList alquilerPorCliente(Cliente cliente){
        ArrayList lista = null;
        String sql = "select * from alquileres, productos where alquileres.id_cliente = "+cliente.getId()+" and ";
        sql += "alquileres.id_producto = productos.Id order by fechaInicio";
        //System.out.println(sql);
        Connection con = null;
        Statement st = null;
        ResultSet rs = null;

        try{
            lista = new ArrayList();
            con = AccesoDatos.getConexion();
            st = con.createStatement();
            rs = st.executeQuery(sql);
            while(rs.next()){
                Alquiler alquiler = new Alquiler();
                Producto producto;
                alquiler.setCliente(new Cliente());
                String tex = rs.getString("tipoProducto");
                if(tex.equalsIgnoreCase("DVD") || tex.equalsIgnoreCase("BlueRay")){
                    producto = new Pelicula();
                }
                else{
                    producto = new Videojuego();
                }
                alquiler.setProducto(producto);
                alquiler.setTarifa(new Tarifa());
                alquiler.setIdAlquiler(rs.getInt("Id"));
                alquiler.getProducto().setId(rs.getInt("id_producto"));
                alquiler.getCliente().setId(rs.getInt("id_cliente"));
                alquiler.getTarifa().setId(rs.getInt("id_tarifa"));
                tex = rs.getString("fechaInicio");
                alquiler.setFechaInicio(UtilFecha.obtenerFechaBD(tex));
                tex = rs.getString("fechaPrevDev");
                alquiler.setFechaPrevistaDev(UtilFecha.obtenerFechaBD(tex));
                tex = rs.getString("fechaDevReal");
                alquiler.setFechaDevolucionReal(UtilFecha.obtenerFechaBD(tex));
                lista.add(alquiler);
            }
            System.out.println(lista.size());
            rs.close();
            st.close();
        }
        catch(Exception e){
            System.out.println("Error al obtener los alquileres del cliente "+e.getMessage());
        }

        AccesoDatos.cerrarConexion(con);

            if(!lista.isEmpty()){
                
                for(int i = 0; i< lista.size(); i++){
                    Alquiler alquiler = (Alquiler)lista.get(i);
                    int id = alquiler.getProducto().getId();
                    TipoProductoEnum tipo = ProductoJDBC.obtenerTipoProductoPorId(id);
                    if(tipo.toString().equals("BlueRay") || tipo.toString().equals("DVD")){
                        alquiler.setProducto(PeliculaJDBC.obtenerPeliculaPorId(id));
                    }
                    else{
                        alquiler.setProducto(VideojuegoJDBC.obtenerVideojuegoPorId(id));
                    }

                    id = alquiler.getCliente().getId();
                    alquiler.setCliente(ClienteJDBC.obtenerClientePorId(id));
                    lista.set(i, alquiler);
                }
            }
        return lista;
    }

    public static ArrayList consultarProductosAlquilados(){
        ArrayList<Alquiler>lista = new ArrayList();
        
        String sql = "select * from alquileres, productos where alquileres.id_producto = productos.Id and ";
        sql += " fechaDevReal = '1970-01-01' order by productos.titulo";
        Connection con = null;
        Statement st = null;
        ResultSet rs = null;
        //System.out.println(sql);

        try{
            con = AccesoDatos.getConexion();
            st = con.createStatement();
            rs = st.executeQuery(sql);
            while(rs.next()){
                Alquiler alquiler = new Alquiler();
                Producto producto;
                Cliente cliente = new Cliente();
                Tarifa tarifa = new Tarifa();
                Ubicacion ubicacion = new Ubicacion();
                Proveedor proveedor = new Proveedor();
                Franquicia franquicia = new Franquicia();
                alquiler.setIdAlquiler(rs.getInt("Id"));
                String texto = rs.getString("productos.tipoProducto");
                if(texto.equalsIgnoreCase("DVD") || texto.equalsIgnoreCase("BlueRay")){
                    producto = new Pelicula();
                }
                else{
                    producto = new Videojuego();
                }
                producto.setTipo(TipoProductoEnum.valueOf(texto));
                producto.setCodigo(rs.getInt("codigo"));
                producto.setTitulo(rs.getString("titulo"));
                producto.setEstado(ProductoEnum.valueOf(rs.getString("estadoProducto")));
                producto.setEdadRecomendada(rs.getInt("edadRecomendada"));
                producto.setDescripcion(rs.getString("descripcion"));
                producto.setPrecioCompraProducto(rs.getDouble("precioCompra"));

                tarifa.setId(rs.getInt("alquileres.id_tarifa"));
                ubicacion.setId(rs.getInt("id_ubicacion"));
                proveedor.setIdProveedor(rs.getInt("id_proveedor"));
                franquicia.setId(rs.getInt("id_franquicia"));

                //producto.setTarifa(tarifa);
                producto.setUbicacion(ubicacion);
                producto.setProveedor(proveedor);
                producto.setFranquicia(franquicia);
                cliente.setId(rs.getInt("id_cliente"));

                alquiler.setProducto(producto);
                alquiler.setCliente(cliente);
                alquiler.setTarifa(tarifa);
                texto = rs.getString("fechaInicio");
                alquiler.setFechaInicio(UtilFecha.obtenerFechaBD(texto));
                texto = rs.getString("fechaPrevDev");
                alquiler.setFechaPrevistaDev(UtilFecha.obtenerFechaBD(texto));
                texto = rs.getString("fechaDevReal");
                alquiler.setFechaDevolucionReal(UtilFecha.obtenerFechaBD(texto));

                lista.add(alquiler);
            }
        }
        catch(Exception e){
            System.out.println("[!] Error al obtener los productos alquilados actualmente "+e.getMessage());
        }
                finally{
            AccesoDatos.cerrarConexion(con);
        }
        if(!lista.isEmpty()){
            for(int indice = 0;indice < lista.size();indice++){
                Alquiler a = (Alquiler)lista.get(indice);
                int id = a.getCliente().getId();
                Cliente c = ClienteJDBC.obtenerClientePorId(id);
                a.setCliente(c);
                lista.set(indice, a);
            }
        }
        return lista;
    }
}
